#include <iostream>
#include <ctype.h>
#include <pthread.h>
#include <queue>

#include "Barbearia.h"

void* clientelaDaemon( void* );

std::queue<Cliente> filaLaFora;
/* -- A Barbearia jah nasce prontinha, td mundo a postos -- */ 
Barbearia barbearia;

int main ( int argc, char** argv )
{
	/* -- Lista LaFora --*/
		
	Cliente novoCliente;
	pthread_t threadBarbudos;	
	
	/* -- Enchendo a Lista LaFora -- */	
	for ( int i=0; i < 30 ; i++)
	{
		novoCliente.setID(i);
		filaLaFora.push(novoCliente);			
	}	
	
	/* -- Thread rodando, esta enfia gente dentro da barbearia esporadicamente -- */
	pthread_create(&threadBarbudos, NULL,
		clientelaDaemon, (void*) &barbearia.isFilaClientesLivre);
	
	/* -- aguarda o termino da thread -- */
	pthread_join(threadBarbudos, NULL);
	
	return 0;
}

/* -- enfia gente dentro da barbearia esporadicamente -- */
void* clientelaDaemon( void* arg)
{
	bool* isFilaClientesLivre = (bool*) arg;
		/* -- while there are people outside -- */
	while(filaLaFora.size() > 0)
	{	
			/* -- wait a little random bit -- */
		sleep(1+rand()%4);
			/* -- verify critical area availability -- */
		if (*isFilaClientesLivre == true)
		{
			*isFilaClientesLivre = false; // reserva a fila de Clientes
			if (barbearia.mFilaClientes.size() < 20) // se tiver lugar
			{
				barbearia.entradaDeCliente( filaLaFora.front() ); // go inside
				*isFilaClientesLivre = true;	// libera a fila de Clientes
				filaLaFora.pop();
				std::cout << "um entrou na barbearia\n";									
			}
			else
			{
				filaLaFora.pop(); // go shopping
				std::cout << "Um foi as compras...\n";
			}
		}
	
	}
	return NULL;
}
